/*
 * @Author: yang-tengyuyxd 1282291612@qq.com
 * @Date: 2024-10-27 13:43:13
 * @LastEditors: yang-tengyuyxd 1282291612@qq.com
 * @LastEditTime: 2024-10-27 19:50:31
 * @FilePath: /yxd/管道/mypipe.cc
 * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
 */
#include <iostream>
#include <unistd.h>
#include <string>
#include <cstdlib>
#include <sys/types.h>
#include <sys/wait.h>

using namespace std;

// 想要 子进程写入 父进程读取
int main()
{
    // 1.创建管道
    int fds[2] = {0};  // 两个 一个输入 一个输出
    int n = pipe(fds); // fds：输出型参数
    if (n != 0)
    {
        cerr << "pipe error" << endl;
        return 1;
    }

    // 2.创建子进程
    pid_t id = fork();
    if (id < 0)
    {
        cerr << "fork error" << endl;
        return 2;
    }
    else if (id == 0)
    {
        // 子进程
        // 3.关闭不需要的fd
        close(fds[0]); // ::close(fds[0]); 方便看 是 ::系统调用 还是库函数

        int cnt = 0;

        while (1)
        {
            string message = "hello bit,hello ";
            message += to_string(getpid()); // to_string 把一个int转成字符串
            message += ", ";
            message += to_string(cnt);

            ::write(fds[1], message.c_str(), message.size()); // 通过文件描述符 写(1) 给进程
            cnt++;

            sleep(1);
        }

        close(fds[1]); // 不关问题也不大 下面子进程会自己退出
        exit(0);
    }
    else
    {
        // 父进程
        // 3.关闭不需要的fd
        close(fds[1]);

        char buffer[1024];
        while (1)
        {
            size_t n = ::read(fds[0], buffer, 1024);
            if (n > 0)
            {
                buffer[n] = 0;
                cout << "child->father, message: " << buffer << endl;
            }
        }

        close(fds[0]);

        pid_t rid = waitpid(id, nullptr, 0);
        cout << "father wait child success: " << rid << endl;
    }
    return 0;
}